package com.obelisco.vista.plantillas;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;


import org.apache.commons.beanutils.MethodUtils;

//import ucla.cumlaude.exception.CumLaudeException;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.DialogoError;
import com.obelisco.vista.componentes.TipoFuncion;

public class VentanaListaSimple extends VentanaListaBase {
	
	private String metodoBusqueda;
	
	private String metodoEliminacion;
	
	private List<Object> listaParametrosRealizarBusqueda;
	
	public VentanaListaSimple() {
		super();
		this.tabla.setSeleccionMultiple(false);
	}
	
	public List getItems() {

		List lista = new ArrayList();
		try {
			String nombreMetodo = metodoBusqueda;
			if (listaParametrosRealizarBusqueda != null)
			{
				if (listaParametrosRealizarBusqueda.size() != 0)
				{
					lista = (List) MethodUtils.invokeMethod(servicio, nombreMetodo, listaParametrosRealizarBusqueda.toArray());					
				}
				else
				{
					lista = (List) MethodUtils.invokeMethod(servicio, nombreMetodo, null);
				}
			}
			else
			{
				lista = (List) MethodUtils.invokeMethod(servicio, nombreMetodo, null);
			}
			
		}
		catch (InvocationTargetException ivokEx) {
			//ivokEx.printStackTrace();
			if (ivokEx.getTargetException() instanceof ObeliscoException) {
				ObeliscoException obex = (ObeliscoException) ivokEx.getTargetException();
				if (obex.getNumError() > 0) {
					DialogoError.mostrar("Error", obex.getNumError());
				} else {
					DialogoError.mostrar("Error", obex.getMessage());
				}
			} else {
				DialogoError.mostrar("Error", 0);
			}
		}
		catch (Exception e) {
			DialogoError.mostrar("Error", 0);
			e.printStackTrace();
		}
		return lista;
	}
	
	public void ejecutarEliminacion(Object object) {
		// Object argumentos[] = new Object[] {object};
		try {
			/*if(this.ventanaEmergente!=null){
				if(!this.ventanaEmergente.listeners.isEmpty()){
					distribuirEventoEliminar(this.ventanaEmergente.listeners, object);
				}				
			}*/
			
			String nombreMetodo = metodoEliminacion;
			MethodUtils.invokeMethod(servicio, nombreMetodo, object);						
		}
		catch (InvocationTargetException ivokEx) {
			ivokEx.printStackTrace();
			if (ivokEx.getTargetException() instanceof ObeliscoException) {				
				ObeliscoException obex = (ObeliscoException) ivokEx.getTargetException();
				if (obex.getNumError() > 0) {
					DialogoError.mostrar("Error", obex.getNumError());
				} else {
					DialogoError.mostrar("Error", obex.getMessage());
				}
			} else {
				DialogoError.mostrar("Error", 0);
			}
		}
		catch (ObeliscoException clEx) {
			if (clEx.getNumError() > 0) {
				DialogoError.mostrar("Error", clEx.getNumError());
			} else {
				DialogoError.mostrar("Error", clEx.getMessage());
			}
		}
		catch (Exception e) {
			DialogoError.mostrar("Error", 0);
			e.printStackTrace();
		}
		
	}
	
	private void distribuirEventoEliminar(Vector<ComponenteDatosListener> listeners, Object object) {
		for (ComponenteDatosListener l : listeners) {
			l.onConfirmarEliminacion(object);
		}
	}
	
	private void distribuirEventoFuncionPersonalizada(Vector<ComponenteDatosListener> listeners, Object object, TipoFuncion tipoFuncion, String nombreFuncion) {
		for (ComponenteDatosListener l : listeners) {
			l.onFuncionPersonalizada(object, tipoFuncion, nombreFuncion);
		}
	}

	@Override
	protected void cargarDatos() {
		this.tabla.setItems(getItems(), getCamposMostrar(), getAlineacionCampos());					
	}
	
	@Override
	protected void cargarDatos(List<Object> listaParametrosRealizarBusqueda) {
		this.listaParametrosRealizarBusqueda = listaParametrosRealizarBusqueda;
		this.tabla.setItems(getItems(), getCamposMostrar(), getAlineacionCampos());
	}
	
	@Override
	public void onEliminacionConfirmada(Object object) {
		// TODO Auto-generated method stub
		ejecutarEliminacion(object);
	}

	@Override
	public void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion, String nombre) {
		distribuirEventoFuncionPersonalizada(this.ventanaEmergente.listeners, objeto, tipoFuncion, nombre);
	}
	
	public void limpiarSeleccionTabla(){
		this.tabla.limpiarSeleccionTabla();
	}

	public String getMetodoBusqueda() {
		return metodoBusqueda;
	}

	public void setMetodoBusqueda(String metodoBusqueda) {
		this.metodoBusqueda = metodoBusqueda;
	}

	public String getMetodoEliminacion() {
		return metodoEliminacion;
	}

	public void setMetodoEliminacion(String metodoEliminacion) {
		this.metodoEliminacion = metodoEliminacion;
	}
	
}
